<?xml version="1.0" encoding="UTF-8"?>
<doc>
<title>变量的使用</title>

<para>
<ptitle>变数嘛…</ptitle>
<r/>
　KAG 中所谓的变数其实就是、<r/>
<r/>
・记录某些数据的东西<r/>
<r/>
　而已。<r/>
<r/>
　但是呢、KAG 因为是基于 <kw>TJS2</kw> 这一脚本语言的系统、KAG 的变数实际上继承了 TJS2 变数的功能，可以发挥很强大的作用。（译注：口胡，给我一个能保存的数据类再说……）<r/>
<r/>
　这个初级教程只讲了些基本的用法、像 KAG 内部的方法、属性之类的操作、使用吉里吉里本体功能之类的没有详细说、完全是<b>一片泥沼</b>的状态、容易掉坑的请注意(笑)。<r/>
</para>

<para>
<ptitle>变数的种类</ptitle>
　KAG 变数的种类一共有 3 种。随着游戏档案存取的普通的「<kw>游戏变数</kw>」と、和游戏档案的存取无关的、可以一直被记录的「<kw>系统变数</kw>」、临时记录用的「<kw>临时变数</kw>」。「系统变数」在吉里吉里/KAG 程序关闭之后、再执行这个游戏的话，内容依然保留。「临时变数」在关闭游戏后即自动清除、也不会被游戏存档记录。<r/>
<r/>
　游戏变数以 <kw>f</kw> 、系统变数以 <kw>sf</kw> 、临时变数以 <kw>tf</kw> 作为名字的开头。<r/>
<r/>
　此外、KAG ( 其实也就是 TJS2 ) 的变数、可以记录文字列或者数值 ( 文字列数值一类的、变数中记录的内容种类即是所谓的「<kw>类型</kw>」 )。变数的命名相当自由，变数的个数没有限制。存储的文字列没有长度限制，数值的话也支持实数等等。<r/>
　KAG 3.x 之后「数组」和「字典」也可以使用了 ( 在这个文档里没有说明 )。<r/>
<note>
　TJS2 的整数型为 64bit、实数型为 double ( 双精度 ) 。<r/>
　文字列支持以0为终结符的 UNICODE 文字列、没有长度限制。<r/>
</note>
</para>

<para>
<ptitle>变数命名的规定</ptitle>
　吉里吉里 / KAG 中、变数的命名是相当自由的。但是、再怎么自由，吉里吉里 / KAG 可以使用的变数名字还是有一定规则的。<r/>
<r/>
<dl>
<dt>变数名可以使用半角英数和全角文字、_ (下划线) </dt>
<dd>
　<b><tt>abc&amp;def</tt></b> 或者、<b><tt>a-z</tt></b> 像这样的变数名不能用。<r/>
　<b><tt>final_count</tt></b> 像这样含有下划线、<b><tt>主人公的名字</tt></b> 这样使用全角文字都是可以的(全角記号也全部可以用于给变数明明)。
</dd>
<dt>不过要注意 变数名不能以半角数字开头</dt>
<dd>
　<b><tt>2friends</tt></b> 或者 <b><tt>3com</tt></b> 像这样的变数名不能用 ( 全角数字开头的话就 OK )。
</dd>
</dl>
<r/>
　这些变数名的前面、游戏变数的话就加上 <b><tt>f.</tt></b> を、系统变数的话就加上 <b><tt>sf.</tt></b> 、临时变数则加上 <b><tt>tf.</tt></b> 。
<r/>
　例如、以下这些变数名。<r/>
<r/>
<tt> <b>f.flag1  sf.username  sf.playcount  tf.i  f.enokazu  f.变数その１ </b>...</tt><r/>
<r/>
　此外、第一次使用变数（等于是变数刚创建的时候），变数的内容默认为 0 、对文字列来说就是 '' ( 空文字列 ) 、这是有点特殊的状态。一般情况下、第一次使用这个变数的时候，请给变数赋一个值比较好。<r/>
<r/>
<note>
　<b>f</b> 或者 <b>sf</b> 或者 <b>tf</b> 之外还有 <b>kag</b> 开头的变数、<b>kag</b> 开头的变数，可以对 KAG 的系统内部一些数值进行操作（比如说kag.fullsreen，代表窗口是否处在全屏状态）。<r/>
</note>
</para>

<para>
<ptitle>变数的代入</ptitle>
　要对变数赋値、通常使用 <kw>eval</kw> 指令。例如、想把 1000 代入变数 <tt>f.flag1</tt> 的话・・・<r/>
<bq>
[eval exp="<b>f.flag1 <kw>=</kw> 1000</b>"]<r/>
</bq>
　就像以上这样。也就是、变数名之后写上 = （等号）、之后写上想要代入的数值。<r/>
<r/>
　想要代入文字的话、<r/>
<bq>
[eval exp="<b>f.变数之１ = '文字列'</b>"]<r/>
</bq>
　则是像以上这样。也就是、 = 之后要使用 '' 把想代入的文字列括起来 ( 请注意单引号和双引号的差别哦 )。<r/>
　没有文字列用的变数、数值用变数这样的差别、变数类型会随着值的类型变化而自动改变。<r/>
<r/>
　给一个变数赋其他变数的值、<r/>
<bq>
[eval exp="<b>f.flag1 = f.flag2</b>"]<r/>
</bq>
<r/>
则是像以上这样写。<r/>
</para>

<para>
<ptitle>变数的演算</ptitle>
<r/>
　想要对某些变数进行计算的情况、<r/>
<bq>
[eval exp="<b>f.flag1 = f.flag1 + 1</b>"]<r/>
</bq>
　也是一样的。在这个例子中、会将 f.flag1 加 1 后的值代入 f.flag1  ( 也就是相当于 f.flag1 的值加上了 1  )。<r/>
　exp 属性就是用来书写 TJS2 相关的「<kw>式</kw>」的。<r/>
　TJS 式中、<kw>*</kw>(乘) <kw>/</kw>(除) <kw>+</kw>(加) <kw>-</kw>(减) 之类的 <kw>演算子</kw>照常规使用 ( 和数学式一样，有计算的优先顺序，例如乘除优先于加减 )。在式子中也可以使用 (  )  括号。<r/>
　例如、<r/>
<bq>
[eval exp="<b>f.flag1 = f.flag1 + f.flag2 * f.flag3</b>"]<r/>
</bq>
　这样的话、f.flag2 和 f.flag3 的乘积加上 f.flag1 的和将被代入 f.flag1 。<r/>
<r/>
　除法计算的话则是使用 / (斜线) 符号。<r/>
<bq>
[eval exp="<b>f.flag1 = f.flag2 / f.flag3</b>"]<r/>
</bq>
　以上的例子 f.flag2 除以 f.flag3 的商将被代入 f.flag1 。<r/>
　但是、除不尽的情况下， f.flag1 的值将会是实数、假如想要获得整数值的话、请使用整数除算演算子 \ 、<r/>
<bq>
[eval exp="<b>f.flag1 = f.flag2 \ f.flag3</b>"]<r/>
</bq>
　写成以上这样。<r/>
<r/>
<r/>
　此外、文字列之间的计算，也可以使用 + 演算子。<r/>
<r/>
<bq>
[eval exp="f.flag2 = 'hoge'"]<r/>
[eval exp="f.flag3 = 'une'"]<r/>
[eval exp="<b>f.flag1= f.flag2 + f.flag3</b>"]<r/>
</bq>
　像上面的例子、 f.flag1 的值将会是 'hogeune' 。<r/>
<r/>
<note>
　TJS2 的语法是参考 JavaScript (ECMAScript) 设计的、这些方面非常相似 ( 但并不是完全相同 )。<r/>
　通常的算术演算动作等等是基本相同的。文字列之间的计算或者文字列和数值的混合计算也基本相同。<r/>
</note>
</para>

<para>
<ptitle>文字列和数值</ptitle>
　KAG 的变数、并不会有文字列类、数值类的强制区别，变数一旦建立，名字也不会改变。<r/>
　当把文字列赋给变数时，就成为保存文字列用的变数、把数值赋给变数时，就成为保存数值用的变数。<r/>
　最麻烦的是进行混用的时候。比如说，+ 这个符号就有了很多很多的意义(^^;<r/>
<r/>
　文字列与文字列和并会使用到 + 演算子、数值的加法也会使用到 + 演算子、文字列和数值混合计算的场合、如果参与计算的其中一个是文字列、那么其他的数值也会被自动转换成文字列。<r/>
<r/>
　例如、f.flag2 内记录的是 'hoge' 这个文字列、f.flag3 则记录着 10 这个数值、<r/>
<bq>
[eval exp="<b>f.flag1 = f.flag2 + f.flag2</b>"]<r/>
</bq>
　那么、f.flag1 里记录的会是 'hoge10' 这个文字列。
<r/>
<r/>
　此外、如果无论如何都希望把文字列转为数值的话，也是有办法的。例如使用 [input] 指令让玩家输入数字、这种情况下也是使用 + 演算子。把+ 演算子放在想转换成数值的内容之前。例如、f.flag1 中记录着 '20' 这个文字列、<r/>
<r/>
<bq>
[eval exp="<b>f.flag1 = +f.flag1</b>"]<r/>
</bq>
<r/>
　这么写的话、f.flag1 的内容就会转换为数值、再次记入 f.flag1 中。f.flag1 现在记录的就是数值型的 20 。<r/>
<r/>
<note>
　+ 演算子连写的情况也必须注意。想把 f.flag3 变为数值型，并和 f.flag2 相加的话、写成 <tt>f.flag2++f.flag3</tt> 这种形式是会出错的 (因为 ++ 是另外一个演算子 )。请在加号间空一格，写成 <tt>f.flag2+ +f.flag3</tt> 的形式。<r/>
</note>
<note>
　单个的 + 演算子 ( 如之前举例的 <tt>f.flag1 = +f.flag1</tt> 例子中的 + ) 、文字列内如果有着小数点 ( 0.3 之类 ) 的话、结果会转换成实数。想要结果变为整数 ( 小数点以下舍去 )、写成 int + 的话就 OK 了。还是以之前的例子示范、就是写成 <tt>f.flag1 = int +f.flag1</tt> 这样。<r/>
</note>
</para>

<para>
<ptitle>变数的删除・其他</ptitle>
　想要删除变数的话就使用 <kw>delete</kw> 来进行。<b>delete 变数名</b> 这么写的话就可以把变数删除。<r/>
　例如、想要删除 <tt>f.flag1</tt> 的话、<r/>
<bq>
[eval exp="<b>delete f.flag1</b>"]<r/>
</bq>
　就写成这样。<r/>
<r/>
　此外、使用 <kw>clearvar</kw> 指令的话、可以把所有游戏变数（f.开头的变数）全部删除。<r/>
<r/>
　此外、TJS2 中还可以使用一些其他演算子， math 对象，三角函数等等相关的计算 ( 也不知道是不是有用呢 ) 。详细的说明请看吉里吉里 SDK 的 TJS2 说明文档。<r/>
<r/>
　使用 <kw>,</kw> (逗号)的话，可以在一个 eval 指令内写入多个计算式。<r/>
比如说、<r/>
<bq>
[eval exp="f.first=true"]<r/>
[eval exp="f.flag0=0"]<r/>
[eval exp="f.flag1=0"]<r/>
</bq>
　这三个式子、可以简写成以下的样子。<r/>
<bq>
[eval exp="f.first=true<b>,</b> f.flag0=0<b>,</b> f.flag1=0"]<r/>
</bq>
<r/>
　此外、使用 <kw>iscript</kw> 指令、可以代替连续的 eval 指令，让格式变得简单。<r/>
<r/>
　例如、还是之前的三个式子、<r/>
<r/>
<bq>
[iscript]<r/>
f.first=true<b>;</b><r/>
f.flag0=0<b>;</b><r/>
f.flag1=0<b>;</b><r/>
[endscript]<r/>
</bq>
<r/>
　可以写成以上这样。各式的后面，请千万不要忘记写上 ; ( 分号 ) 哦。<r/>
　像这样使用 , (逗号) 或者 iscript 来书写代码，效率会提高很多。<r/>
</para>

<para>
<ptitle>显示变数的内容</ptitle>
　想要在剧本中表示变数的内容、请使用 <kw>emb</kw> 指令。<r/>
　例如说、像以下这样。<r/>
<bq>
[wait time=200]<r/>
*start<r/>
[cm]<r/>
[eval exp="f.数值=200"][eval exp="f.mojiretu='文字列'"]<r/>
f.数值 的内容 : [emb exp="f.数值"][l][r]<r/>
f.mojiretu 的内容 : [emb exp="f.mojiretu"][l][r]<r/>
</bq>
<r/>
　执行起来的话，游戏画面上会显示出：<r/>
<r/>
f.数值 的内容 : 200<r/>
f.mojiretu 的内容 : 文字列<r/>
<r/>
　这样的对话。<r/>
</para>

<para>
<ptitle>实体（entity）</ptitle>
　所谓的实体（entity）是指、以变数的内容、替换其他指令的属性值的功能。<r/>
　书写格式是、属性名 = <kw>&amp;</kw> 变数名。<r/>
<bq>
[wait time=200]<r/>
*start<r/>
[cm]<r/>
[eval exp="f.fontsize=60"]<r/>
[font size="&amp;f.fontsize"]这是60号的文字[resetfont]<r/>
</bq>
<r/>
　这种情况下、f.fontsize 里记录的 60 这个值、就成为了 font 指令的 size 属性值。<r/>
<r/>
　实体的本质是：对 &amp; 之后的部分进行计算，并将计算结果作为属性值。也就是说、&amp; 的后面，除了变数名以外，也可以写入 TJS 式。<r/>
</para>


<para>
<ptitle>条件判断</ptitle>
　要判断变数和某个值是否相同，可以使用以下的演算子。<r/>
<bq>
a<kw>==</kw>b    a 和 b 相等的情况下为真(true)<r/>
a<kw>!=</kw>b    a 和 b 不相等的情况下为真(true)<r/>
a<kw>&lt;</kw>b     a 小于 b 的情况下为真(true)<r/>
a<kw>&gt;</kw>b     a 大于 b 的情况下为真(true)<r/>
</bq>
<r/>
　此外也可以使用 &gt;= や &lt;= (大于等于、小于等于) 。<r/>
　像这样的条件判断，主要是用在 if 指令中的。<r/>
<r/>
　<kw>if</kw> 指令是、如果 exp 属性的值为 真(true) ，就执行从if 到 endif 中间的剧本段内容。<r/>
<r/>
<bq>
[if exp="f.flag1<b>==</b>2"]f.flag1 的值是 2 [endif]<r/>
[if exp="f.flag1<b>!=</b>2"]f.flag1 的值不是 2 [endif]<r/>
</bq>
<r/>
　变数的用途非常广泛，拥有很强大的功能。<r/>
</para>

</doc>